ISSDK  1.8
IoT Sensing Software Development Kit
gpio_driver.c
Go to the documentation of this file.
1 /*
2  * Copyright 2022 NXP
3  * All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  */
7 
8 /**
9 * @file gpio_driver.c
10 * @brief The gpio_driver.c file contains Generic API Adaption to i.MXRT1180 SDK 2.x GPIO Driver.
11 */
12 #if 1
13 #include "gpio_driver.h"
14 
15 /*******************************************************************************
16 * Definitions
17 ******************************************************************************/
18 #define GPIO_DRV_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2, 3) /* driver version */
19 // ISR handler array for each gpio pin in the system
20 #define GPIO_NUMBER_OF_PIN 0x20
21 
22 /*******************************************************************************
23 * Variables
24 ******************************************************************************/
25 
26 /* Driver Version */
27 static const GENERIC_DRIVER_VERSION DriverVersion = {GPIO_API_VERSION, GPIO_DRV_VERSION};
29 static gpioConfigiMXSDK_t gpioConfigDefault = {
30  .pinConfig = {kRGPIO_DigitalInput, 0}, .interruptMode = kRGPIO_InterruptRisingEdge};
31 
32 /*******************************************************************************
33  * Code
34  ******************************************************************************/
35 
36 /***********************************************************************
37  *
38  * Function Name : imxsdk_gpio_get_version
39  * Description : get the i.MXRT1050RT gpio driver version.
40  *
41  ***************************************************************************/
43 {
44  return DriverVersion;
45 }
46 
47 /***********************************************************************
48  *
49  * Function Name : imxsdk_gpio_pin_init
50  * Description : Initialize particular GPIO pin used by board.
51  *
52  ***************************************************************************/
54  pinID_t aPinId, gpio_direction_t dir, void *apPinConfig, gpio_isr_handler_t aIsrHandler, void *apUserData)
55 {
56  gpioConfigiMXSDK_t *pGpioConfig = (gpioConfigiMXSDK_t *)apPinConfig;
57  gpioHandleiMXSDK_t *pinHandle = (gpioHandleiMXSDK_t *)aPinId;
58  if (NULL == apPinConfig)
59  {
60  pGpioConfig = &gpioConfigDefault;
61  }
62 
63  pGpioConfig->pinConfig.pinDirection = dir == GPIO_DIRECTION_IN ? kRGPIO_DigitalInput : kRGPIO_DigitalOutput;
64  /* Set the pin information */
65  RGPIO_PinInit(pinHandle->base, pinHandle->pinNumber, &pGpioConfig->pinConfig);
66 
67  /* Isr is installed */
68  if (aIsrHandler)
69  {
70  RGPIO_SetPinInterruptConfig(pinHandle->base, pinHandle->pinNumber, kRGPIO_InterruptOutput0, pGpioConfig->interruptMode);
71  /* Enable the IRQ */
72  EnableIRQ(pinHandle->irq);
73  isrObj[pinHandle->portNumber][pinHandle->pinNumber].isrHandle = aIsrHandler;
74  isrObj[pinHandle->portNumber][pinHandle->pinNumber].pUserData = apUserData;
75  /* Enable GPIO pin interrupt */
76  //RGPIO_PortEnableInterrupts(pinHandle->base, pinHandle->mask);
77  }
78 }
79 
80 /***********************************************************************
81  *
82  * Function Name : imxsdk_gpio_set_pin
83  * Description : Set output level of individual GPIO pin to logic 1.
84  *
85  ***************************************************************************/
87 {
88  gpioHandleiMXSDK_t *pinHandle = (gpioHandleiMXSDK_t *)aPinId;
89  pinHandle->pinStatus = PIN_SET;
90  RGPIO_PinWrite(pinHandle->base, pinHandle->pinNumber, PIN_SET);
91 }
92 
93 /***********************************************************************
94  *
95  * Function Name : imxsdk_gpio_clr_pin
96  * Description : Set output level of individual GPIO pin to logic 0..
97  *
98  ***************************************************************************/
100 {
101  gpioHandleiMXSDK_t *pinHandle = (gpioHandleiMXSDK_t *)aPinId;
102  pinHandle->pinStatus = PIN_CLR;
103  RGPIO_PinWrite(pinHandle->base, pinHandle->pinNumber, PIN_CLR);
104 }
105 
106 /***********************************************************************
107  *
108  * Function Name : ksdk_gpio_toggle_pin
109  * Description : toggle the currrent output logic of individual GPIO pin.
110  *
111  ***************************************************************************/
113 {
114  gpioHandleiMXSDK_t *pinHandle = (gpioHandleiMXSDK_t *)aPinId;
115 
116  /* Check PIN Status and toggle */
117  if (PIN_CLR == pinHandle->pinStatus)
118  {
119  imxsdk_gpio_set_pin(aPinId);
120  }
121  else if (PIN_SET == pinHandle->pinStatus)
122  {
123  imxsdk_gpio_clr_pin(aPinId);
124  }
125 }
126 
127 /***********************************************************************
128  *
129  * Function Name : imxsdk_gpio_write_pin
130  * Description : Set output level of individual GPIO pin to desired value, ie 1 or 0.
131  *
132  ***************************************************************************/
133 void imxsdk_gpio_write_pin(pinID_t aPinId, uint8_t aValue)
134 {
135  gpioHandleiMXSDK_t *pinHandle = (gpioHandleiMXSDK_t *)aPinId;
136  RGPIO_WritePinOutput(pinHandle->base, pinHandle->pinNumber, aValue);
137 }
138 
139 /***********************************************************************
140  *
141  * Function Name : imxsdk_gpio_read_pin
142  * Description : Read current input value of individual GPIO pin.
143  *
144  ***************************************************************************/
146 {
147  gpioHandleiMXSDK_t *pinHandle = (gpioHandleiMXSDK_t *)aPinId;
148  return RGPIO_ReadPinInput(pinHandle->base, pinHandle->pinNumber);
149 }
150 
151 /***********************************************************************
152  *
153  * Function Name : imxsdk_gpio_handle_interrupt
154  * Description : handle the gpio interrupt in a pin.
155  *
156  ***************************************************************************/
157 void imxsdk_gpio_handle_interrupt(RGPIO_Type *apBase, port_number_t gpioPortNumber)
158 {
159  uint32_t isfr = RGPIO_GetPinsInterruptFlags(apBase, kRGPIO_InterruptOutput0);
160 
161  /* Parse through all the pending interrupt for a PORT */
162  for (uint8_t i = 0; i < GPIO_NUMBER_OF_PIN; i++)
163  {
164  if (isfr & (1 << i))
165  {
166  gpio_isr_handler_t handle = isrObj[gpioPortNumber][i].isrHandle;
167  if (handle == NULL)
168  {
169  continue;
170  }
171  /* Call user defined handler */
172  handle(isrObj[gpioPortNumber][i].pUserData);
173  RGPIO_ClearPinsInterruptFlags(apBase, kRGPIO_InterruptOutput0, (1 << i));
174  }
175  }
176 }
177 
181 };
182 #endif
#define PIN_CLR
Definition: gpio_driver.h:22
#define GPIO_NUMBER_OF_PIN
Definition: gpio_driver.c:20
The GPIO Pin Configuration i.MX SDK.
Definition: gpio_driver.h:40
void imxsdk_gpio_toggle_pin(pinID_t aPinId)
Definition: gpio_driver.c:111
void imxsdk_gpio_set_pin(pinID_t aPinId)
Definition: gpio_driver.c:85
uint32_t imxsdk_gpio_read_pin(pinID_t aPinId)
Definition: gpio_driver.c:144
gpio_pin_config_t pinConfig
Definition: gpio_driver.h:42
The gpio isr object.
Definition: gpio_driver.h:62
void(* gpio_isr_handler_t)(void *apUserData)
Definition: Driver_GPIO.h:34
Access structure of the GPIO Driver.
Definition: Driver_GPIO.h:38
void imxsdk_gpio_write_pin(pinID_t aPinId, uint8_t aValue)
Definition: gpio_driver.c:132
void * pinID_t
GPIO Driver direction.
Definition: Driver_GPIO.h:30
void * pUserData
Definition: gpio_driver.h:64
enum port_number port_number_t
GPIO PORT NAMES.
void imxsdk_gpio_pin_init(pinID_t aPinId, gpio_direction_t dir, void *apPinConfig, gpio_isr_handler_t aIsrHandler, void *apUserData)
Definition: gpio_driver.c:53
IRQn_Type irq
Definition: gpio_driver.h:54
gpio_interrupt_mode_t interruptMode
Definition: gpio_driver.h:43
gpio_isr_handler_t isrHandle
Definition: gpio_driver.h:65
port_number_t portNumber
Definition: gpio_driver.h:55
void imxsdk_gpio_clr_pin(pinID_t aPinId)
Definition: gpio_driver.c:98
enum gpio_direction_en gpio_direction_t
#define PIN_SET
Definition: gpio_driver.h:21
void imxsdk_gpio_handle_interrupt(GPIO_Type *apBase, port_number_t gpioPortNumber)
Definition: gpio_driver.c:156
ARM_DRIVER_VERSION GENERIC_DRIVER_VERSION
Definition: Driver_GPIO.h:32
#define GPIO_API_VERSION
Definition: Driver_GPIO.h:14
#define GPIO_DRV_VERSION
Definition: gpio_driver.c:18
uint32_t pinNumber
Definition: gpio_driver.h:52
GENERIC_DRIVER_VERSION imxsdk_gpio_get_version(void)
Definition: gpio_driver.c:42
GENERIC_DRIVER_GPIO Driver_GPIO_KSDK
Definition: gpio_driver.c:177
The GPIO pin handle for i.MX SDK.
Definition: gpio_driver.h:49
GPIO_Type * base
Definition: gpio_driver.h:51
uint8_t pinStatus
Definition: gpio_driver.h:56